# lib

### Место для библиотек. 

Библиотеки slagheap это исходные файлы на языке макроассемблера Эверест. 
Расширения исходных файлов - ```.xa``` или ```asm```.


<!-- позиционно независимый код который не привязанн к конкретным адресам -->

### Application binary interface (ABI)

Базовые правила написания программ для архитектуры Эверест: 
1. Адрес возврата из функции (подпрограммы) помещается в регистр общего назначения R15. Если функция использует этот регистр или вызывает другие функции (подпрограммы) его необходимо где-нибудь сохранять, обвчно на стеке.
2. Младшие восемь регистров - R0-R7 могут быть использованы для передачи аргументов функциям (подпрограмам), они так же могут измениться в процессе работы функции. Регистр R0 используется для возвращения результата выполнения функции. Старшие восемь регистров R8-R15 подпрограмма не должна менять. Если она их использует, то должна сохранить при входе в функцbю и восстановить при выходе.
3. Регистр R4 используется в качестве указателя стека. Это соглашение. Аппаратный стек архитектура не поддерживает.
4. Система команд содержит префиксы. Префиксы могут менять логику работы команд. Следующая за префиксом инструкция сбрасывает префикс.



### Пример библиотечной функции (подрограммы) на языке макроассемблер Эверест

Пример ассемблерного кода для "Террикона". Функция выводит строку в последовательный порт.
Использована простая запись без именования регистров и констант.

<code>
; --- Функция вывода строки
; Вход: R1 - адрес строки
; Выход: R0 - количество переданных символов

function	_puts
	push	r15		; Сохранение адреса возврата из подпрограммы
	push	r2
	mov	r0, r1		; Копирование указателя на строку
load_word:
	mov	r2, (r0)	; Загрузка машинного слова (4-символа)
	load	r4, 4		; Количество байт в машинном слове
check_byte:
	rol	r2, 8		; Циклический сдвиг на 8 бит влево
	load	r3, 0xff	; Загрузка восьмибитной константы
	and	r3, r2		; Проверка на конец строки
	je	done		; Вывод строки закончен
	call	_putchar        ; Вызов подпрограммы вывода символа
	inc	r0, 1		; Инкремент указателя
	dec	r4, 1		; Декремент счётчика
	jne	check_byte	; Следующий символ
	jmp	load_word	; Повтор операции
done:
	clc			; Сброс переноса
	subc	r0, r1		; Подсчёт количества выведенных символов
	pop	r2
	pop	r15		; Восстановление адреса возврата
	return			; Возврат из функции
end
</code>

Функция работала на плате марсоход и передавала данные с платы на удалённый терминал. При переносе на эмулятор Slagheap функция не изменилась.

Это пример не самой простой функции. Сложность заключается в разрядности операций. Процессорное ядро Эверест и система команд на момент публикации
 не имеет инструкций для операций с 8-ми и 16-ти быитными регистрами, поэтому их отсутствие приходится компенсировать сдвигами и масками.

### Пример тестовой функции VGA меню

Ниже показана предварительная версия без подсветки активного пункта и обработки действий пользователя.

![image](https://github.com/L4OS/Slagheap/assets/1204638/be540b31-198b-4614-812c-e787cece9fe7)
